package com.lonely;

/**
 * @author 黄志标
 * @date 2023/4/14 13:42
 * @Description: https://leetcode.cn/problems/palindrome-number/
 * <p>
 * 给你一个整数 x ，如果 x 是一个回文整数，返回 true ；否则，返回 false 。
 * 回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。
 * 例如，121 是回文，而 123 不是。
 */
public class Question9_回文数 {


    public static void main(String[] args) {
        System.out.println(isPalindrome1(10000021));
        System.out.println(isPalindrome2(10000021));
    }

    /**
     * 判断是否是回文数 --- 自己首次尝试
     *
     * @param x
     * @return
     */
    public static boolean isPalindrome1(int x) {

        char[] chars = String.valueOf(x).toCharArray();

        // 中间数index
        int centerIndex = chars.length % 2 == 0 ? chars.length / 2 : chars.length / 2 + 1;

        for (int i = 0; i < chars.length; i++) {
            if (i > centerIndex) {
                break;
            }

            //去除对应的结尾的索引
            int currentLast = chars.length - 1 - i;

            if (chars[i] != chars[currentLast]) {
                return false;
            }
        }

        return true;
    }


    /**
     * 优化写法
     * 思路： 只遍历一次，举例，1221，通过 x % 10 依次得到当前数据的最后一位数字， 通过上一个的结果比如 上一次%10的结果为1， 此次乘以10 ，再加上当前次的%10，就可以得到当前的处理数
     *
     * @param x
     * @return
     */
    public static boolean isPalindrome2(int x) {
        if (x == 0) {
            return true;
        }

        //或者结尾为0的数字，直接返回false
        if (x % 10 == 0) {
            return false;
        }

        //int straight = x;
        int reverse = 0;

        //这里的操作，可以理解成 操作中的数字每次都剔除最后一个数字，而反向的数据，每次在末尾加上剔除的数据
        //当操作处理了一半后，就会跳出该循环
        while (x > reverse) {
            //获取此次的反向数据
            reverse = reverse * 10 + x % 10;

            //数字/10，就理解成 踢出最后一个数字
            x /= 10;
        }

        return x == reverse || reverse / 10 == x;
    }

}
